#include <stdio.h>
#include <stdlib.h>
#include <getch.h>
#include <string.h>
#include "struct.h"
#include "system.h"
#include "tools.h"

Student* stu;	//	定义学生结构体数组

int temp = 0;	//	所登帐号标记

//	显示菜单
char menu(void)
{
	system("clear");
	puts("*****欢迎使用学生系统*****");
	puts("1.查询成绩");
	puts("2.修改密码");
	puts("3.查看个人信息");
	puts("4.退出系统");
	puts("************************");
	char ch = getch();
	printf("%c\n",ch);
	return ch;
}

//	登录函数
int login_stu(void)	
{
	int i = 0;
	char id[20] = {};
	char passwd[20] = {}; 	//	定义存储数组

	printf("请输入您的帐号：");
	get_str(id);
	for(i=0;i<50;i++)
	{
		if(strcmp(id,stu[i].id)==0)	break;	//	对照已有账号
	}
	if(i == 50)
	{
		printf("您输入的帐号有误！\n");			//	账号错误提醒
		anykey_continue();
		return -1;
	}
	if(stu[i].cnt == 3)			//	判断账号是否锁定
	{
		printf("帐号锁定！请登录教师帐号以解锁\n");
		anykey_continue();
		return -1;
	}
	while(stu[i].cnt!=3)
	{
		printf("请输入密码(剩%d次)：",3-stu[i].cnt);	//	密码输入机会
		get_str(passwd);
		if(0 == strcmp(stu[i].passwd,"0"))			//	修改初始密码
		{
			printf("请修改初始密码：");
			get_str(stu[i].passwd);
			stu[i].cnt = 0;
			show_msg("修改成功！请重新登录",1.5);
			return -1;
		}
		else if(strcmp(passwd,stu[i].passwd)==0)	//	判断密码对错
		{
			show_msg("登录成功！\n",1.5);
			stu[i].cnt = 0;
			return i;
		}
		else 
		{
			show_msg("密码错误！\n",1.5);				//	密码错误操作
			stu[i].cnt++;
			anykey_continue();
			return -1;
		}
	}
	return -1;
}

void rank(void)
{
	int t =0;	//	定义学生数标记
	float sum[50],flag;
	float sum_chn,max_chn = 0,min_chn = 100;
	float sum_eng,max_eng = 0,min_eng = 100;
	float sum_math,max_math = 0,min_math = 100;		//	定义总分和各科分变量
	for(int i=0;i<50;i++)
	{
		if(stu[i].sex == 0)	
		{
			t = i;		//	记录学生数
			break;
		}
		
		//	计算总分及各科总分
		sum[i] = stu[i].chinese + stu[i].english + stu[i].math;
		sum_chn += stu[i].chinese;
		sum_eng += stu[i].english;
		sum_math += stu[i].math;
		
		//	找出各科最高/低分
		if(stu[i].chinese > max_chn)	max_chn = stu[i].chinese;
		if(stu[i].chinese < min_chn)	min_chn = stu[i].chinese;
		if(stu[i].english > max_eng)	max_eng = stu[i].english;
		if(stu[i].english < min_eng)	min_eng = stu[i].english;
		if(stu[i].math > max_math)		max_math = stu[i].math;
		if(stu[i].math < min_math)		min_math = stu[i].math;	
	}
	
	//	循环对总分进行排名
	for(int i=0;i<=t;i++)
	{
		for(int j=i+1;j<=t;j++)
		{
			if(sum[i] < sum[i])
			{
				flag = sum[i];
				sum[i] = sum[j];
				sum[j] =flag;
			}
		}
	}
	printf("总分排名:\n");
	for(int i=0;i<t;i++)
	{
		printf("%.1f \n",sum[i]);		//	遍历打印总分排名
	}
	
	//	打印各科分数信息
	printf("各科平均分(语、数、英):%.2f %.2f %.2f\n",sum_chn/t,sum_eng/t,sum_math/t);
	printf("各科最高分(语、数、英):%.1f %.1f %.1f\n",max_chn,max_eng,max_math);
	printf("各科最低分(语、数、英):%.1f %.1f %.1f\n",min_chn,min_eng,min_math);
	anykey_continue();
}

void modify_own(void)
{
	char passwd_old[20] = {};	//	定义存储数组
	printf("请输入原密码：");
	get_str(passwd_old);
	if(strcmp(passwd_old,stu[temp].passwd) == 0)	//	判断原密码输入对错
	{
		printf("请输入新密码：");
		get_str(stu[temp].passwd);					//	输入新密码
		show_msg("修改成功！\n",1.5);
		return;
	}
	else
	{
		show_msg("密码错误！\n",1.5);					//	密码错误提示信息
		return;
	}
}

void check(void)
{
	//	打印个人信息
	printf("个人信息\n");
	printf("姓名：%s\n性别：%s\n学号：%s\n语文：%.1f\n英语：%.1f\n数学：%.1f\n",
		stu[temp].name,'w' == stu[temp].sex?"女":"男",stu[temp].id,
		stu[temp].chinese,stu[temp].english,stu[temp].math);
	anykey_continue();
}

void student(void)
{
	temp = login_stu();		//	接收登录函数返回值
	if(temp != -1)			//	判断是否登录成功
	{
		for(;;)
		{
			switch(menu())
			{
				case '1':	rank();		break;
				case '2':	modify_own();	break;
				case '3':	check();	break;
				case '4':	return;
			}
		}
	}
}
